package day4

import (
	"fmt"
	"sort"
)

/*
1. close：主要用来关闭channel
2. len：用来求长度，比如string、array、slice、map、channel
3. new：用来分配内存，主要用来分配值类型，比如int、struct。返回的是指针
4. make：用来分配内存，主要用来分配引用类型，比如chan、map、slice
5. append：用来追加元素到数组、slice中
6. panic和recover：用来做错误处理

go get安装第三方包
*/

//数组
func Array01()  {
	lenN := len("12345678")
	fmt.Println(lenN)

	//数组
	var a[5]int
	a[1] = 1
	a[2] = 2
	//数组是值类型，因此改变副本的值，不会改变本身的值
	arr2 := a
	arr2[2] = 6
	fmt.Println(arr2)
	fmt.Println(a)

	var arr3[5]int
	modify1(arr3)
	fmt.Println(arr3)
	modify2(&arr3)
	fmt.Println(arr3)

	//初始化
	var age1 = [5]int{1,2,3,4}
	age2 := [...]int{1,2,3,4,5,6}
	//多维数组
	age3 := [2][5]int{{1,2,3,4},{6,5,4,3}}
	fmt.Println(age1,age2,age3)
}

//值类型不能直接修改
func modify1(arr [5]int){
	arr[0] = 100
}

//直接修改指针
func modify2(arr *[5]int){
	(*arr)[0] = 100
}

/*
切片：
切片是数组的一个引用，因此切片是引用类型
切片的长度可以改变，因此，切片是一个可变的数组
len()求长度
cap可以求出slice最大的容量
*/
func Slice01(){
	arr := [...]int{1,2,3,4,5,6}
	//数组转换为切片
	slice1 := arr[2:5]
	slice2 := arr[:5]
	slice3 := arr[2:]
	fmt.Println(slice1,slice2,slice3)
	//去掉末尾
	slice4 := slice3[:len(slice3) -1]
	fmt.Println(slice4)

	//make创建切片
	makeSlice1 := make([]byte,5)
	makeSlice1[1] = 2
	fmt.Println(makeSlice1)
	//append 会在切片长度外添加元素
	makeSlice1 = append(makeSlice1, 5,6,7)
	fmt.Println(makeSlice1)
	//遍历
	for _, v := range makeSlice1 {
		fmt.Print(v)
	}

	//拷贝,产生新的切片（修改对原切片没影响）
	s1 := []int{1,2,3,4,5}
	s2 := make([]int, 10)
	copy(s2, s1)
	s2[2] = 6
	fmt.Println(s1,s2)

	//string底层就是一个byte的数组
	str := "hello world"
	fmt.Println(str[6:])
	//修改字符串
	s := []byte(str)
	s[0] = 'm' //这里单引号 代表字符
	str = string(s)
	fmt.Println(str)
}

func Sorth(){
	//升序
	ints := []int{2, 4, 3, 5, 7, 6, 9, 8, 1, 0}
	sort.Ints(ints)
	fmt.Println(ints)

	//降序
	ints2 := []int{2, 4, 3, 5, 7, 6, 9, 8, 1, 0}
	sort.Sort(sort.Reverse(sort.IntSlice(ints2)))
	fmt.Println(ints2) // [9 8 7 6 5 4 3 2 1 0]
}

/*
map是引用类型
*/
func Maph(){
	//添加
	mapa := map[string]string{"hello": "world"}
	fmt.Println(mapa)

	mapb := make(map[string]string, 10)
	mapb["nnn"] = "mmm"
	mapb["www"] = "qqq"
	fmt.Println(mapb["nnn"])

	//遍历
	for k, v := range mapb {
		fmt.Println(k,v)
	}

	//删除
	delete(mapb, "www")
	fmt.Println(mapb,len(mapb)) //获取长度

	//赋值方式
	items := make(map[int]int, 5)
	for i := 0; i < 5; i++ {
		items[i] = i
	}
	fmt.Println(items)
}
